home *** CD-ROM | disk | FTP | other *** search
- #include <minimal.h>
- #include <osbind.h>
- #include <string.h>
-
- #define TRUE 1
- #define FALSE 0
-
- extern char *syserr(long);
-
- int
- do_chmod(name,setbits,clrbits)
- char *name;
- int setbits;
- int clrbits;
- {
- char *e;
- long err;
- int oldattr, newattr;
-
- oldattr = err = Fattrib(name,0,0);
- if (err < 0) goto error;
- newattr = (oldattr & ~clrbits) | setbits;
- err = Fattrib(name,1,newattr);
- if (err < 0) {
- error:
- e = syserr(err);
- error1:
- (void)Fwrite(2,(long)strlen(name),name);
- (void)Fwrite(2,2L,": ");
- (void)Fwrite(2,(long)strlen(e),e);
- (void)Fwrite(2,2L,"\r\n");
- return 1;
- }
- return 0;
- }
-
- int
- main(argc,argv)
- int argc;
- char *argv[];
- {
- int e;
- int bits, setbits, clrbits;
- char *p;
-
- --argc, ++argv;
- setbits = clrbits = 0;
- while (**argv == '+' || **argv == '-') {
- bits = 0;
- p = &argv[0][1];
- while (*p) {
- switch(*p) {
- /* FA_CHANGED is called FA_ARCHIVE by some libraries */
- case 'a': bits |= FA_CHANGED; break;
- case 'h': bits |= FA_HIDDEN; break;
- case 's': bits |= FA_SYSTEM; break;
- case 'w': bits |= FA_RDONLY; break;
- default: goto usage;
- }
- p++;
- }
- if (**argv == '+') {
- setbits |= (bits & ~FA_RDONLY);
- if (bits & FA_RDONLY) clrbits |= FA_RDONLY;
- }
- else {
- clrbits |= (bits & ~FA_RDONLY);
- if (bits & FA_RDONLY) setbits |= FA_RDONLY;
- }
- argc--, argv++;
- }
-
- if (!argc) {
- usage:
- (void)Fwrite(2,40L,"Usage: chmod [+ahsw] [-ahsw] names ...\r\n");
- (void)Fwrite(2,42L,"'a'rchive, 'h'idden, 's'ystem 'w'ritable\r\n");
- Pterm(1);
- }
-
- e = 0;
- while (argc) {
- e |= do_chmod(*argv,setbits,clrbits);
- argv++, argc--;
- }
- return e;
- }
-